package br.com.projetoia.dama;

import br.com.projetoia.dama.enums.WalkerTypeEnum;
import br.com.projetoia.dama.exception.GameException;

/**
 * Classe responsável pelo gerenciamento do Jogo.
 * 
 * @author Rafael
 * 
 */
public class GameManagement {

	private Board board;
	private House selectedHouse;

	public void setBoard(Board board) {
		this.board = board;
	}

	/**
	 * Retorna o tabuleiro do jogo.
	 * 
	 * @return
	 */
	public Board getBoard() {
		return this.board;
	}

	/**
	 * Seleciona uma casa do jogo.
	 * 
	 * @param line
	 * @param column
	 * @throws GameException
	 */
	public void selectHouse(int line, int column) throws GameException {
		this.selectedHouse = this.getBoard().getHouse(line, column);
		if (this.selectedHouse == null) {
			throw new GameException("Casa selecionada é inválida!");
		}
	}

	/**
	 * Retorna a casa selecionada.
	 * 
	 * @return
	 */
	public House getSelectHouse() {
		return this.selectedHouse;
	}

	/**
	 * Move uma peça para outra casa.
	 * 
	 * @param line
	 *            linha da casa para onde a peça será movida.
	 * @param column
	 *            coluna da casa para onde a peça será movida.
	 * @throws GameException
	 */
	public void moveWalkerTo(int line, int column) throws GameException {

		if (this.getSelectHouse().getPosition().getLine() > line
				&& this.getSelectHouse().getWalker().getType().equals(WalkerTypeEnum.WHITE)) {
			throw new GameException("Movimento inválido!");
		}

		int columnDifference = this.getSelectHouse().getPosition().getColumn() - column;
		int columnAbsoluteDifference = Math.abs(columnDifference);

		if (columnAbsoluteDifference > 1) {
			Position position = this.getSelectHouse().getPosition();

			int positionLineIncrement = this.getLineIncrement(this.getSelectHouse().getWalker());
			int positionColumnIncrement = position.getColumn() > column ? -1 : 1;

			House house = this.board.getHouse(position.getLine() + positionLineIncrement,
					position.getColumn() + positionColumnIncrement);
			if (house.getWalker() == null
					|| house.getWalker().getType()
							.equals(this.getSelectHouse().getWalker().getType())) {
				throw new GameException("Movimento inválido!");
			} else {
				house.setWalker(null);
			}

		}

		House newHouse = this.getBoard().getHouse(line, column);

		if (newHouse.getWalker() != null) {
			throw new GameException("Movimento inválido!");
		}

		Walker selectedWalker = this.selectedHouse.getWalker();
		selectedWalker.setPosition(newHouse.getPosition());
		newHouse.setWalker(selectedWalker);

		this.selectedHouse.setWalker(null);
	}

	/**
	 * Retorna o valor do incremento/descremento da linha do tabuleiro.
	 * 
	 * @param selectedWalker
	 * @return
	 */
	private int getLineIncrement(Walker selectedWalker) {

		switch (selectedWalker.getType()) {
		case WHITE:
			return 1;

		case BLACK:
			return -1;

		default:
			return 0;
		}
	}
}
